package GUI;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Point;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.ListSelectionModel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.ImageIcon;

import java.awt.Font;
import java.awt.Color;

import javax.swing.SwingConstants;

import clientes.Cliente;
import mapa.Coordenada;
import mapa.Direccion;
import miEmpresa.Deposito;
import odpgl.Implementacion;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;

import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.text.html.HTMLDocument.Iterator;

import org.openstreetmap.gui.jmapviewer.Coordinate;
import org.openstreetmap.gui.jmapviewer.JMapViewer;
import org.openstreetmap.gui.jmapviewer.MapMarkerDot;
import org.openstreetmap.gui.jmapviewer.MapPolygonImpl;
import org.openstreetmap.gui.jmapviewer.interfaces.MapMarker;
import org.openstreetmap.gui.jmapviewer.interfaces.MapPolygon;

import pedidos.Instancia;
import pedidos.Pedido;
import pedidos.Recorrido;

import java.awt.SystemColor;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class panelABMRecorridos extends JDialog 
{
	
	public Implementacion pedidosGeoLoc = new Implementacion();
	public JPanel panel;
	private final JLabel fondo = new JLabel("");
	
	private JMapViewer mapa;

	
	
	
	public static void main(String[] args) {
		try {
			panelABMRecorridos dialog = new panelABMRecorridos();
			dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
			dialog.setVisible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Create the dialog.
	 */
	public panelABMRecorridos() 
	{
		setBounds(200, 50,905,600);
		getContentPane().setLayout(null);
		
		JPanel panel_1 = new JPanel();
		panel_1.setBounds(35, 142,500, 400);
		getContentPane().add(panel_1);
		panel_1.setOpaque(false);
		
		final JLabel subtitulo = new JLabel("Pedidos pendientes");
		subtitulo.setForeground(Color.WHITE);
		subtitulo.setFont(new Font("Arial", Font.BOLD | Font.ITALIC, 25));
		subtitulo.setBounds(68, 95, 270, 25);
		getContentPane().add(subtitulo);
		
		
		JPanel panelSuperior = new JPanel();
		getContentPane().add(panelSuperior, BorderLayout.NORTH);
		
		JPanel panelInferior = new JPanel();
		getContentPane().add(panelInferior, BorderLayout.SOUTH);
		
		final JSlider slider = new JSlider();
		slider.setValue(10);
		slider.setMaximum(19);
		slider.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent arg0)
			{
				int valor = slider.getValue();
				mapa.setZoom(valor);
			}
		});
		panelInferior.add(slider);
		
		
		
		mapa = new JMapViewer();
		mapa.setOpaque(false);
		mapa.setPreferredSize(new Dimension(800, 600));
		mapa.setMapMarkerVisible(true);
		mapa.setLocation(new Point(0, 0));
		mapa.setMinimumSize(new Dimension(0, 0));
		mapa.setMaximumSize(new Dimension(2147483647, 2147483647));
		mapa.addMouseMotionListener(new MouseMotionAdapter() {
			@Override
			public void mouseDragged(MouseEvent arg0)
			{
				Coordinate c = mapa.getPosition();
				setTitle(c.getLat() + ", " + c.getLon());
			}
		});
		mapa.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0)
			{
				slider.setValue( mapa.getZoom() );
			}
		});
		mapa.addMouseWheelListener(new MouseWheelListener() {
			public void mouseWheelMoved(MouseWheelEvent arg0)
			{
				slider.setValue( mapa.getZoom() );
			}
		});
		mapa.setZoomContolsVisible(false);
		mapa.setDisplayPositionByLatLon(-34.522044, -58.700895, 10);
		
		

		
		final JLabel Titulo = new JLabel("Gestión de recorridos");
		Titulo.setBounds(161, 13, 537, 60);
		Titulo.setHorizontalAlignment(SwingConstants.CENTER);
		Titulo.setForeground(Color.WHITE);
		Titulo.setFont(new Font("Arial", Font.BOLD | Font.ITALIC, 35));
		getContentPane().add(Titulo);
		
		fondo.setIcon(new ImageIcon("Imagenes/azulFondo.jpeg"));
		fondo.setBounds(0, 0, 906, 560);
		getContentPane().add(fondo);
		
		
		mapa.setBounds(0, 0, 887, 555);
		getContentPane().add(mapa);
		
		mapa.setVisible(false);
				
		
		
		
	
		
		Pedido listaPedidos [] = new Pedido[pedidosGeoLoc.getPedidosSolicitados().size()];
		java.util.Iterator<Pedido> iterador = pedidosGeoLoc.getPedidosSolicitados().iterator();
		int z=0;
		while(iterador.hasNext())
		{
			listaPedidos [z] = (Pedido) iterador.next();
			z++;					
		}
			
		final JList lista = new JList<Pedido>(listaPedidos);
		lista.setFont(new Font("Arial", Font.BOLD | Font.ITALIC, 16));
		panel_1.add(lista);
		panel_1.setVisible(true);
		
		
		JButton btnVolverInicial = new JButton("Volver");
		btnVolverInicial.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) 
			{
				dispose();
			}
		});
		btnVolverInicial.setBounds(777, 530, 110, 25);
		getContentPane().add(btnVolverInicial);
		
		

	
		final JButton btnCalcular = new JButton("Calcular Mejor Recorrido");
		btnCalcular.setBounds(534, 141, 201, 25);
		getContentPane().add(btnCalcular);
		btnCalcular.setVisible(true);
		
		JButton btnVolver = new JButton("Volver");
		btnVolver.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) 
			{
//				mapa.setVisible(false);
//				fondo.setVisible(true);
//				subtitulo.setVisible(true);
//				Titulo.setVisible(true);
//				btnCalcular.setVisible(true);
//				lista.setVisible(true);
				
				dispose();
			}
		});
		btnVolver.setBounds(777, 530, 110, 25);
		mapa.add(btnVolver);
		
		
		
		final Set<Pedido> listaACalcular = new HashSet<Pedido>(); 
		
		
		btnCalcular.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) 
			{
				for(int y=0; y<lista.getSelectedValues().length; y++)
				listaACalcular.add((Pedido)lista.getSelectedValues()[y]);
	
//				System.out.println("Lista" +listaACalcular);
				//creo un deposito
				
				Direccion dire1 = new Direccion("Buenos Aires","Ciudad Autonoma de Buenos Aires" , "San Martin", 663);
			
				Coordenada c = new Coordenada(-34.600214,-58.374024);
				Cliente uno = new Cliente("27-32456789-0", dire1,c, "Casa Central","46634567", "Claudio");
			
				
				Deposito deposito = new Deposito(uno, "Carlos","6345-4535","ir de 08a15",dire1,-34.6003665,-58.3740278);
				
				Recorrido elMejor = pedidosGeoLoc.resolver(listaACalcular,deposito);
				
				mapa.setVisible(true);
				fondo.setVisible(false);
				subtitulo.setVisible(false);
				Titulo.setVisible(false);
				btnCalcular.setVisible(false);
				lista.setVisible(false);
				
				mostrarCamino(elMejor.getCiudades());
				mostrarClientes(elMejor.getCiudades());
			}
		});
		
		
	}
	
	
	
	private void mostrarCamino(ArrayList<Pedido> arrayList)
	{
		ArrayList<Coordinate> lista2 = new ArrayList<Coordinate>();
			
		for(Pedido c : arrayList)
		{
			double latitud = c.getDomicilio().getCoordenada().getLatitud();
			double longitud = c.getDomicilio().getCoordenada().getLongitud();
			lista2.add(new Coordinate(latitud, longitud));
		}
		
		
		MapPolygon poligono = new MapPolygonImpl(lista2);
		poligono.getStyle().setColor(Color.BLUE);
		mapa.addMapPolygon(poligono);
		
	}
	
	private void mostrarClientes(ArrayList<Pedido> arrayList) {
		for (Pedido c : arrayList) {

			double latitud = c.getDomicilio().getCoordenada().getLatitud();
			double longitud = c.getDomicilio().getCoordenada().getLongitud();

			Coordinate coord = new Coordinate(latitud, longitud);
			MapMarker marker = new MapMarkerDot(c.getCliente().getNombre(), coord);
			mapa.addMapMarker(marker);
		}

	}

}
